package com.yanggu.scala.chapater18.upperbounds

//java中上界
//在 Java 泛型里表示某个类型是 A 类型的子类型，使用 extends 关键字，这种形式叫 upper bounds(上限或上界)，语法如下: <T extends A>
//或用通配符的形式: <? extends A>
object UpperBoundsDemo01 {

  def main(args: Array[String]): Unit = {
    //1. 第一种方法
    println("传统方法: " + new CompareInt(1, 2).greater)

    //2. 第二种方法
    //这里必须要使用Java的Integer。因为Integer实现了Comparable接口
    println("通用方法: " + new CommonCompare[Integer](Integer.valueOf(1), Integer.valueOf(2)).greater)
    //这里使用了隐式转换

    //3. 第三种方法
    //implicit def float2double(x: Float): Double = x.toDouble
    val commonCompare3 = new CommonCompare[java.lang.Float](10.1f, 10.2f)
    println(commonCompare3.greater)
  }

}

/*
scala中上界应用案例-要求
编写一个通用的类，可以进行Int之间、Float之间、等实现了Comparable接口的值直接的比较.//java.lang.Integer
分别使用传统方法和上界的方式来完成，体会上界使用的好处.
*/
//传统方法
class CompareInt(n1: Int, n2: Int) {

  def greater = if (n1 > n2) n1 else n2

}

//scala的泛型上界
//说明
//1. [T <: Comparable[T]] 表示T是Comparable的子类
//2. T必须要实现Comparable接口
//3. T可以使用compareTo方法
//4. 这样写通用性更好
//5. 通配符的形式: [_ <: Comparable[_]]
class CommonCompare[T <: Comparable[T]](n1: T, n2: T) {

  def greater = if (n1.compareTo(n2) > 0) n1 else n2

}